﻿#ifndef ___Class_IntArray
#define ___Class_IntArray

class IntArray {
	int nelem;
	int* vec;

public:
	class IdxRngErr {
	private:
		const IntArray* ident;
		int idx;
	public:
		IdxRngErr(const IntArray* p, int i) : ident(p), idx(i) {}
		int index() const { return idx; }
	};
	explicit IntArray(int size) : nelem(size) {
		vec = new int[size];
	}
	IntArray(const IntArray& x);
	~IntArray() {
		delete[] vec;
	}
	int size() const {
		return nelem;
	}
	int& operator[](int i) {
		if (i < 0 || i >= nelem) {
			throw IdxRngErr(this, i);
		}
		return vec[i];
	}
	const int& operator[](int i) const {
		if (i < 0 || i >= nelem) {
			throw IdxRngErr(this, i);
		}
		return vec[i];
	}
	IntArray& operator=(const IntArray& x) {
		if (&x != this) {
			if (nelem != x.nelem) {
				delete[] vec;
				nelem = x.nelem;
				vec = new int[nelem];
			}
			for (int i = 0; i < nelem; i++) {
				vec[i] = x.vec[i];
			}
		}
		return *this;
	}
};

#endif